import os
import shutil

def copy_or_move_files(src_folder, dest_folder, config_filename, overwrite_existing, only_copy):
    """
    复制或移动指定的文件或文件夹到目标文件夹。

    :param src_folder: 源文件夹路径
    :param dest_folder: 目标文件夹路径
    :param config_filename: 配置文件名，文件中每行是要操作的文件或文件夹名
    :param overwrite_existing: 是否覆盖目标文件夹中已存在的文件或文件夹
    :param only_copy: 是否只复制而不移动
    """
    # 读取配置文件中的文件或文件夹名
    with open(config_filename, 'r') as config_file:
        items_to_copy = [line.strip() for line in config_file]

    for item in items_to_copy:
        src_path = os.path.join(src_folder, item)
        dest_path = os.path.join(dest_folder, item)

        if not os.path.exists(src_path):
            print(f"源路径 {src_path} 不存在，跳过。")
            continue

        if os.path.isfile(src_path):
            if not overwrite_existing and os.path.exists(dest_path):
                print(f"目标文件 {dest_path} 已存在，跳过。")
                continue

            if only_copy:
                print(f"复制文件 {src_path} 到 {dest_path}.")
                shutil.copy2(src_path, dest_path)  # 复制文件并保留元数据
            else:
                print(f"移动文件 {src_path} 到 {dest_path}.")
                shutil.move(src_path, dest_path)  # 移动文件

        elif os.path.isdir(src_path):
            if os.path.exists(dest_path):
                if not overwrite_existing:
                    print(f"目标文件夹 {dest_path} 已存在，跳过。")
                    continue
                else:
                    print(f"目标文件夹 {dest_path} 已存在，将其删除.")
                    shutil.rmtree(dest_path)

            print(f"复制文件夹 {src_path} 到 {dest_path}.")
            shutil.copytree(src_path, dest_path)  # 复制整个文件夹

            if not only_copy:
                print(f"删除源文件夹 {src_path}.")
                shutil.rmtree(src_path)  # 删除源文件夹

        else:
            print(f"{src_path} 既不是文件也不是文件夹，跳过。")

# 示例调用
copy_or_move_files(
    src_folder='source_folder',
    dest_folder='destination_folder',
    config_filename='config.txt',
    overwrite_existing=False,
    only_copy=True
)

# 用python写一个程序，复制或移动指定的文件或文件夹到指定目标文件夹。
# 主体函数有5个参数，源文件夹，目标文件夹，配置文件名，是否覆盖已有，
# 是否只复制。配置文件是个纯文本文件，每行一个文件名，也有可能是文件夹名，不包括全路径。
# “是否覆盖已有”如果是True，即便目标文件夹存在，也执行操作，否则跳过；
# “是否只复制”如果是False，则执行移动操作（或者复制后删除源）